/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tarea1automatas;
import java.util.*;
/**
 *
 * @author MarioEspinoza
 */
public class Estado {

    private int nombre;
    private boolean estadoInicial;
    private boolean estadoFinal;
    private Integer cantidadEstados;
    private ArrayList<String> transiciones ;
    private ArrayList<Integer> destinoTransicion;
    private ArrayList<boolean[][]> matricesAdyacencia ;

    public Estado()
    {
        
    }
    
    public Estado(Integer nombre,int cantidadEstados,int cantidadSimbolos)
    {
        this.nombre = nombre;
        this.cantidadEstados = cantidadEstados;
        this.transiciones = new ArrayList<String>();
        this.destinoTransicion = new ArrayList<Integer>();
        this.matricesAdyacencia = new ArrayList<boolean[][]>();

        for(int i=0;i<cantidadSimbolos;i++)
        {
            this.matricesAdyacencia.add(new boolean[cantidadEstados][cantidadEstados]);
        }
    }
    
    public void agregarTransicion(Integer idEstadoDestino,Integer indiceTransicion,String transicion)
    {
        boolean[][] matriz = null;
        this.transiciones.add(transicion);
        this.getDestinoTransicion().add(idEstadoDestino);
        if(indiceTransicion<=getMatricesAdyacencia().size())
        {
            matriz = getMatricesAdyacencia().get(indiceTransicion);
            matriz[nombre][idEstadoDestino]=true;

            getMatricesAdyacencia().set(indiceTransicion,matriz);
        }
        else
        {
            matriz = new boolean[cantidadEstados][cantidadEstados];

            for(int x = 0;x<cantidadEstados;x++)
            {
                for(int y = 0;y<cantidadEstados;y++)
                {
                    if(x==nombre && y==idEstadoDestino)
                        matriz[x][y]=true;
                    else
                        matriz[x][y]=false;
                }
            }
            this.matricesAdyacencia.add(matriz);
        }
    }

    /**
     * @return the nombre
     */
    public Integer getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(Integer nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the estadoInicial
     */
    public boolean isEstadoInicial() {
        return estadoInicial;
    }

    /**
     * @param estadoInicial the estadoInicial to set
     */
    public void setEstadoInicial(boolean estadoInicial) {
        this.estadoInicial = estadoInicial;
    }

    /**
     * @return the estadoFinal
     */
    public boolean isEstadoFinal() {
        return estadoFinal;
    }

    /**
     * @param estadoFinal the estadoFinal to set
     */
    public void setEstadoFinal(boolean estadoFinal) {
        this.estadoFinal = estadoFinal;
    }

    /**
     * @return the transiciones
     */
    public ArrayList<String> getTransiciones() {
        return transiciones;
    }

    /**
     * @return the destinoTransicion
     */
    public ArrayList<Integer> getDestinoTransicion() {
        return destinoTransicion;
    }

    /**
     * @param destinoTransicion the destinoTransicion to set
     */
    public void setDestinoTransicion(ArrayList<Integer> destinoTransicion) {
        this.destinoTransicion = destinoTransicion;
    }

    /**
     * @return the matricesAdyacencia
     */
    public ArrayList<boolean[][]> getMatricesAdyacencia() {
        return matricesAdyacencia;
    }

    /**
     * @return the cantidadEstados
     */
    public Integer getCantidadEstados() {
        return cantidadEstados;
    }

    /**
     * @param cantidadEstados the cantidadEstados to set
     */
    public void setCantidadEstados(Integer cantidadEstados) {
        
        for(int i=0;i<this.matricesAdyacencia.size();i++)
        {
            boolean[][] temporal = new boolean[cantidadEstados][cantidadEstados];
            boolean[][] antigua =  matricesAdyacencia.get(i);      
            for(int j=0;j<cantidadEstados;j++)
            {
                for(int k=0;k<cantidadEstados;k++)
                {
                    if(k<this.cantidadEstados && j<this.cantidadEstados)
                        temporal[j][k]= antigua[j][k];
                    else
                        temporal[j][k]=false;
                }
            }
            matricesAdyacencia.set(i, temporal);
        }
        this.cantidadEstados = cantidadEstados;
    }

    /**
     * @param matricesAdyacencia the matricesAdyacencia to set
     */
    public void setMatricesAdyacencia(ArrayList<boolean[][]> matricesAdyacencia) {
        this.matricesAdyacencia = matricesAdyacencia;
    }
}
       